from typing import Any, Dict, Optional

# List of StripeError's from https://stripe.com/docs/api/python#error_handling
# and https://github.com/stripe/stripe-python/blob/master/stripe/error.py

class StripeError(Exception):
    def __init__(
        self,
        message: Optional[str] = None,
        http_body: Optional[str] = None,
        http_status: Optional[int] = None,
        json_body: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, Any]] = None,
        code: Optional[str] = None,
    ) -> None: ...
    http_status: str
    json_body: Dict[str, Any]

class CardError(StripeError):
    def __init__(
        self,
        message: str,
        param: str,
        code: str,
        http_body: Optional[str] = None,
        http_status: Optional[int] = None,
        json_body: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, Any]] = None,
    ) -> None: ...

class RateLimitError(StripeError): ...

class InvalidRequestError(StripeError):
    def __init__(
        self,
        message: str,
        param: str,
        code: str,
        http_body: Optional[str] = None,
        http_status: Optional[int] = None,
        json_body: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, Any]] = None,
    ) -> None: ...

class AuthenticationError(StripeError): ...

class APIConnectionError(StripeError):
    def __init__(
        self,
        message: Optional[str] = None,
        http_body: Optional[str] = None,
        http_status: Optional[int] = None,
        json_body: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, Any]] = None,
        code: Optional[str] = None,
        should_retry: bool = False,
    ) -> None: ...
